package com.shujia

object Code18Abstract {
  def main(args: Array[String]): Unit = {
    /**
     * 抽象类：
     * ① 抽象类使用abstract对类进行修饰
     * ② 在类中可以定义一个具有方法体的函数
     * ③ 抽象类不能存在有实现对象,但是可以通过实现其非抽象方法来获取内部类的实现对象
     * ④ 对于抽象类，如果没有非抽象方法，那么不能直接创建其对象,但是可以通过其子实现类来获取
     *
     */

    val clazz: AbstractClazz = new AbstractClazz() {
      override def getValue(): String = {
        "AbstractClazz 内部类的实现方法"
      }
    }
    println(clazz.getValue())
    clazz.getOtherValue()

    val abstractClazz = new ExtendAbstractClazz()
    abstractClazz.getValue()
    abstractClazz.getOtherValue()

  }
}


abstract class AbstractClazz {

  def getValue(): String

  def getOtherValue(): Unit = {
    println("这是一个非抽象方法")
  }

}


class ExtendAbstractClazz extends AbstractClazz{
  override def getValue(): String = {
    "ExtendAbstractClazz 类中的 getValue"
  }
}